// component/calendar/calendar.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    spotMap: {
      //标点的日期
      type: Object,
      value: {},
    },
    defaultTime: {
      //标记的日期，默认为今日 注意：传入格式推荐为'2022/1/2'或'2022/01/02', 其他格式在ios系统上可能出现问题
      type: String,
      value: '',
    },
    title: {
      //标题
      type: String,
      value: '',
    },
    firstDayOfWeek: {
      // 周起始日
      type: Number,
      value: 7,
    },
  },

  /**
   * 组件的初始数据
   */
  data: {
    calendarHeadDate: ['一', '二', '三', '四', '五', '六', '日'], //日历头部的渲染数组

    currentHR: 1,
    dateListNew: [],
    weekStartDate: "", // 周开始日期
    weekEndDate: "", // 周结束日期
    currentMonth: "", // 当前月份
    currentDate: {}, // 当前日期
    selectDate: {}, // 选中的日期
  },

  /**
   * 组件的方法列表
   */
  methods: {

    // 日历主体渲染方法
    initDate({
      setYear,
      setMonth,
      setDay,
    } = {
        setYear: this.data.selectDate.year,
        setMonth: this.data.selectDate.month,
        setDay: this.data.selectDate.day,
      }) {

      let dateList = []; //需要遍历的日历数组数据
      let now = new Date(setYear, setMonth - 1); //当前月份的1号
      let startWeek = now.getDay(); //目标月1号对应的星期
      let resetStartWeek = (startWeek + this.data.firstDayOfWeek - 1) % 7; //计算星期几的位置
      let selectDay = setDay ? setDay : this.data.selectDate.day;


      for (let i = 0; i < 7; i++) {
        const now2 = new Date(now);
        //当前周的7天
        now2.setDate(
          Math.ceil((selectDay + (resetStartWeek)) / 7) * 7 -
          6 -
          (resetStartWeek) +
          i
        );
        let obj = {};
        obj = {
          day: now2.getDate(),
          month: now2.getMonth() + 1,
          year: now2.getFullYear(),
        };
        dateList[i] = obj;
      }
      this.setData({
        dateListNew: dateList,
        currentMonth: setMonth,
        weekStartDate: `${dateList[0].year}-${dateList[0].month.toString().padStart(2, '0')}-${dateList[0].day.toString().padStart(2, '0')}`,
        weekEndDate: `${dateList[6].year}-${dateList[6].month.toString().padStart(2, '0')}-${dateList[6].day.toString().padStart(2, '0')}`
      })

      this.triggerEvent('selectWeek', { classStartTime: this.data.weekStartDate, classEndTime: this.data.weekEndDate });
    },

    // 更新日历列表
    updateDate(date, offset) {
      const setDate = new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + offset * 7
      ); //取得当前日期的七天后的日期

      this.initDate({
        setYear: setDate.getFullYear(),
        setMonth: setDate.getMonth() + 1,
        setDay: setDate.getDate()
      })
    },

    // 上周
    lastWeekTap() {
      // 清空选中日期
      this.setData({
        selectDate: {}
      })
      this.updateDate(new Date(this.data.weekStartDate), -1)
    },
    // 下周
    nextWeekTap() {
      // 清空选中日期
      this.setData({
        selectDate: {}
      })
      this.updateDate(new Date(this.data.weekStartDate), 1)
    },
    // 本周
    currentWeekTap() {
      // 清空选中日期
      this.setData({
        selectDate: {}
      })
      this.updateDate(new Date(), 0)
    },
    // 某一天被点击
    selectDayChange(e) {
      this.setData({
        selectDate: {
          year: e.currentTarget.dataset.year,
          month: e.currentTarget.dataset.month,
          day: e.currentTarget.dataset.day
        }
      })
      this.triggerEvent('selectDate', { classStartTime: `${this.data.selectDate.year}-${this.data.selectDate.month.toString().padStart(2, '0')}-${this.data.selectDate.day.toString().padStart(2, '0')}`, classEndTime: `${this.data.selectDate.year}-${this.data.selectDate.month.toString().padStart(2, '0')}-${this.data.selectDate.day.toString().padStart(2, '0')}` });
    },

  },
  lifetimes: {
    // 加载事件
    ready() {
      let now = this.data.defaultTime
        ? new Date(this.data.defaultTime)
        : new Date();
      this.setData({
        currentDate: {
          year: now.getFullYear(),
          month: now.getMonth() + 1,
          day: now.getDate(),
        },
      });
      this.updateDate(now, 0)
    },
  },
});
